<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*  元字符：是一些具有特殊含义的字符，可以极大提高了灵活性和强大的匹配功能
     比如英文26个英文字母，我们使用元字符[a-z] 简洁和灵活
     分类：
     1.边界符：表示位置，开头和结尾，必须用什么开头，用什么结尾
     2.量词：表示重复次数
     3.字符类：比如\d表示0~9 */
    console.log(/哈/.test('哈'))    //true  /哈/ 后面文本但凡有一个哈字就行
    console.log(/哈/.test('哈哈'))  //true
    console.log(/哈/.test('二哈'))  //true
    console.log('-----------------')

    /*  // 1.边界符  ^表示匹配行首的文本（以谁开始）  $表示匹配行尾的文本（以谁结束）
     console.log(/^哈/.test('哈'))    //true
     console.log(/^哈/.test('哈哈'))  //true
     console.log(/^哈/.test('二哈'))  //false
     // 重要：如果^和$在一起，表示必须是精确匹配
     console.log(/^哈$/.test('哈'))    //true  ^……$是精确匹配：只有这种情况为true 负责全为false
     console.log(/^哈$/.test('哈哈'))  //false
     console.log(/^哈$/.test('哈皮'))  //false
     console.log(/^哈$/.test('二哈'))  //false
     console.log(/^二哈$/.test('二哈'))  //true
     console.log(/^二哈$/.test('二哈二哈'))  //false
     console.log(/^二哈$/.test('很二哈哈'))  //false
     console.log('-----------------') */

    /* // 2.量词  用来设定某个模式出现的次数
    // *:>=0   +:>=1  ?:0||1  {n}:重复n次  {n,}:>=n  {n,m}:重复n次到m次
    // *:>=0                              （上面这个逗号左右两侧千万不能有空格）
    console.log(/^哈$/.test('哈'))    //true  
    console.log(/^哈*$/.test(''))    //true  
    console.log(/^哈*$/.test('哈'))    //true  
    console.log(/^哈*$/.test('哈哈哈'))  //true  
    console.log(/^哈*$/.test('哈皮'))  //false
    console.log(/^哈*$/.test('二哈'))  //false
    console.log(/^哈*$/.test('哈很哈'))  //false
    console.log('-----------------')
    // +:>=1  
    console.log(/^哈$/.test('哈'))    //true  
    console.log(/^哈+$/.test(''))    //false  >=1 才行
    console.log(/^哈+$/.test('哈'))    //true  
    console.log(/^哈+$/.test('哈哈哈'))  //true  
    console.log(/^哈+$/.test('哈皮'))  //false
    console.log(/^哈+$/.test('二哈'))  //false
    console.log(/^哈+$/.test('哈很哈'))  //false
    console.log('-----------------')
    // ?:0||1  
    console.log(/^哈$/.test('哈'))    //true  
    console.log(/^哈?$/.test(''))    //true  0可以
    console.log(/^哈?$/.test('哈'))    //true  1可以
    console.log(/^哈?$/.test('哈哈哈'))  //true  3不可以
    console.log(/^哈?$/.test('哈皮'))  //false  有其他不可以
    console.log(/^哈?$/.test('二哈'))  //false  有其他不可以
    console.log(/^哈?$/.test('哈很哈'))  //false  有其他不可以
    console.log('-----------------')
    // {n}:重复n次
    console.log(/^哈{4}$/.test('哈'))
    console.log(/^哈{4}$/.test('哈哈'))
    console.log(/^哈{4}$/.test('哈哈哈'))
    console.log(/^哈{4}$/.test('哈哈哈哈'))  //只有这个为true，其他全为false
    console.log(/^哈{4}$/.test('哈哈哈哈哈'))
    console.log(/^哈{4}$/.test('哈哈哈哈哈哈'))
    console.log(/^哈{4}$/.test('哈哈哈哈哈哈哈'))
    console.log('-----------------')
    // {n,}:>=n
    console.log(/^哈{4,}$/.test('哈'))
    console.log(/^哈{4,}$/.test('哈哈'))
    console.log(/^哈{4,}$/.test('哈哈哈'))
    console.log(/^哈{4,}$/.test('哈哈哈哈'))  //true  这个及下面的都为为true  >=4
    console.log(/^哈{4,}$/.test('哈哈哈哈哈'))  //true  5
    console.log(/^哈{4,}$/.test('哈哈哈哈哈哈'))  //true  6
    console.log(/^哈{4,}$/.test('哈哈哈哈哈哈哈'))  //true  7
    console.log('-----------------')
    // {n,m}:重复n次到m次   逗号左右两侧千万不能有空格  >=n && <=m
    console.log(/^哈{4,6}$/.test('哈'))
    console.log(/^哈{4,6}$/.test('哈哈'))
    console.log(/^哈{4,6}$/.test('哈哈哈'))
    console.log(/^哈{4,6}$/.test('哈哈哈哈'))  //true  4   只有4，5，6为true
    console.log(/^哈{4,6}$/.test('哈哈哈哈哈'))  //true  5
    console.log(/^哈{4,6}$/.test('哈哈哈哈哈哈'))  //true  6
    console.log(/^哈{4,6}$/.test('哈哈哈哈哈哈哈'))
    console.log('-----------------') */

    /* // 3.字符类
    // 3.1 []匹配字符集合  [abc]后面的字符只要包含abc中 任意 一个 字符，都返回true
    // [abc] 只选一个
    console.log(/^[abc]$/.test('a'))  //true
    console.log(/^[abc]$/.test('b'))  //true
    console.log(/^[abc]$/.test('c'))  //true
    console.log(/^[abc]$/.test('ab'))  //false
    console.log(/^[abc]{2}$/.test('ab'))  //true
    console.log(/^[abc]{2}$/.test('bc'))  //true
    console.log('-----------------')
    // 3.2 [a-z]  里面有个 - 连字符，表示一个范围
    // [a-z]表示a到z的26个英文字母都可以  [a-zA-Z]表示大小写都可以  [0-9]表示0-9的数字都可以
    // eg：腾讯QQ号：/^[1-9][0-9]{4,}$/ (腾讯QQ号码从10000开始)
    // [a-z] 只选一个
    console.log(/^[A-Z]$/.test('A'))  //true
    console.log(/^[A-Z]$/.test('a'))  //false
    console.log(/^[0-9]$/.test(5))  //true
    console.log(/^[a-zA-Z0-9]$/.test(5))  //true
    console.log(/^[a-zA-Z0-9]$/.test('p'))  //true
    console.log(/^[a-zA-Z0-9]{2}$/.test('3P'))  //true
    console.log('-----------------')
    // []里面加上^取反符号  [^a-z]表示除了小写字母以外的字符  注意要写到在括号里面
    console.log(/^[^a-z]$/.test('e'))  //false
    console.log(/^[^a-z]$/.test(5))  //true
    console.log('-----------------')
    // 单独一个 .   表示匹配除换行符之外的任何单个字符
    console.log(/^.$/.test('d'))  //true
    console.log(/^.$/.test('w'))  //true */
    console.log('-----------------')
    // 3.3预定义：指的是 某些常见模式的间写方式
    // \d:[0-9]  \D:[^0-9]  \w:[a-zA-Z0-9] \W:[^a-zA-Z0-9]
    // \s:[\t\r\n\v\f]（换行符、制表符、空格等）  \S:[^\t\r\n\v\f]
    // eg:日期格式  /^\d{4}-\d{1,2}-\d{1,2}$/
  </script>
</body>

</html>